home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 4 / Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso / Development / Source / Telnet 2.6.1d1 4⁄26⁄94 Folder / source / network / MacTCP / dnr.c next >
Text File  |  1993-10-24  |  5KB  |  214 lines

  1. /*     DNR.c - DNR library for MPW
  2.  
  3.     (c) Copyright 1988 by Apple Computer.  All rights reserved
  4.     
  5. */
  6.  
  7. #ifdef MPW
  8. #pragma segment DNR
  9. #endif
  10.  
  11. # include <Folders.h>            /* JMB */
  12. # include <OSUtils.h>
  13. # include <Errors.h>
  14. # include <Files.h>
  15. # include <Resources.h>
  16. # include <Memory.h>
  17.  
  18. #define OPENRESOLVER    1
  19. #define CLOSERESOLVER    2
  20. #define STRTOADDR        3
  21. #define    ADDRTOSTR        4
  22. #define    ENUMCACHE        5
  23. #define ADDRTONAME        6
  24.  
  25. Handle codeHndl = nil;
  26.  
  27. #ifdef MPW
  28. typedef OSErr (*OSErrProcPtr)();
  29. #else
  30. typedef OSErr (*OSErrProcPtr)(...);
  31. #endif
  32. OSErrProcPtr dnr = nil;
  33.  
  34. #include "dnr.proto.h"
  35.  
  36. short AppleOpenOurRF(short VRefNum, long DirID);
  37.  
  38. /*    I've front end patched Apple's OpenOurRF.  This version looks in the Control Panels
  39.     folder, then the system folder, and finally in the extensions folder for MacTCP.
  40.     Newer versions of MacTCP creaty dummy files in the system folder to avoid this 
  41.     problem.  However, I'd like to catch the case of the older MacTCP versions to avoid
  42.     all calls to our tech support about the "Unable to Open Resolver" message.  The 
  43.     performance hit is minimal. - JMB */
  44.  
  45. /* OpenOurRF is called to open the MacTCP driver resources */
  46.  
  47. short OpenOurRF(void)
  48. {
  49.     short VRefNum, retval;
  50.     long DirID;
  51.     
  52.     FindFolder( kOnSystemDisk, kControlPanelFolderType, kCreateFolder, &VRefNum, &DirID);
  53.     retval = AppleOpenOurRF(VRefNum, DirID);
  54.     
  55.     if (retval == -1)
  56.         {
  57.         FindFolder( kOnSystemDisk, kSystemFolderType, kCreateFolder, &VRefNum, &DirID);
  58.         retval = AppleOpenOurRF(VRefNum, DirID);
  59.         }
  60.     
  61.     if (retval == -1)
  62.         {
  63.         FindFolder( kOnSystemDisk, kExtensionFolderType, kCreateFolder, &VRefNum, &DirID);
  64.         retval = AppleOpenOurRF(VRefNum, DirID);
  65.         }
  66.         
  67.     return(retval);
  68. }
  69.  
  70. short AppleOpenOurRF(short VRefNum, long DirID)
  71. {
  72.     HParamBlockRec fi;
  73.     Str255 filename;
  74.     short curVRefNum;
  75.     WDPBRec pb;
  76.     short status;
  77.  
  78. /*    SysEnvirons(1, &info); */
  79.  
  80.     fi.fileParam.ioCompletion = nil;
  81.     fi.fileParam.ioNamePtr = (unsigned char *) &filename;    /* BYU LSC */
  82.     fi.fileParam.ioVRefNum = VRefNum;
  83.     fi.fileParam.ioDirID = DirID;
  84.     fi.fileParam.ioFDirIndex = 1;
  85.  
  86.     
  87.     while (PBHGetFInfo(&fi, false) == noErr) {
  88.         /* scan system folder for driver resource files of specific type & creator */
  89.         if (fi.fileParam.ioFlFndrInfo.fdType == 'cdev' &&
  90.             (fi.fileParam.ioFlFndrInfo.fdCreator == 'mtcp' ||
  91.             fi.fileParam.ioFlFndrInfo.fdCreator == 'ztcp')) {
  92.             /* found the MacTCP driver file */
  93.     
  94.             /* save current volume (or working directory) */
  95.             pb.ioNamePtr = 0L;
  96.             if (PBHGetVol(&pb,false) != noErr)
  97.                 return(-1);
  98.             curVRefNum = pb.ioVRefNum;
  99.                 
  100.             /* move to system folder */
  101. /*            if (SetVol(NULL,info.sysVRefNum) != noErr)
  102.                 return(-1);                                    */
  103.             status = HOpenResFile(VRefNum, DirID, filename, 0);
  104.             /* back to orignal volume */
  105.             SetVol(NULL,curVRefNum);
  106.             
  107.             return(status);
  108.             }
  109.         /* check next file in system folder */
  110.         fi.fileParam.ioFDirIndex++;
  111.         fi.fileParam.ioDirID = DirID;
  112.         }
  113.     return(-1);
  114.     }    
  115.  
  116.  
  117. OSErr OpenResolver(char *fileName)
  118. {
  119.     short refnum;
  120.     OSErr rc;
  121.     
  122.     if (dnr != nil)
  123.         /* resolver already loaded in */
  124.         return(noErr);
  125.         
  126.     /* open the MacTCP driver to get DNR resources. Search for it based on
  127.        creator & type rather than simply file name */    
  128.     refnum = OpenOurRF();
  129.  
  130.     /* ignore failures since the resource may have been installed in the 
  131.        System file if running on a Mac 512Ke */
  132.        
  133.     /* load in the DNR resource package */
  134.     codeHndl = GetIndResource('dnrp', 1);
  135.     if (codeHndl == nil) {
  136.         /* can't open DNR */
  137.         return(ResError());
  138.         }
  139.     
  140.     DetachResource(codeHndl);
  141.     if (refnum != -1) {
  142.         CloseResFile(refnum);
  143.         }
  144.         
  145.     /* lock the DNR resource since it cannot be reloated while opened */
  146.     HLockHi(codeHndl);                                // JMB made HLock -> HLockHi
  147.     dnr = (OSErrProcPtr) *codeHndl;
  148.     
  149.     /* call open resolver */
  150.     rc = (*dnr)((long) OPENRESOLVER, fileName);        /* BYU LSC - needed (long) */
  151.     if (rc != noErr) {
  152.         /* problem with open resolver, flush it */
  153.         HUnlock(codeHndl);
  154.         DisposHandle(codeHndl);
  155.         dnr = nil;
  156.         }
  157.     return(rc);
  158.     }
  159.  
  160.  
  161. OSErr CloseResolver(void)
  162. {
  163.     if (dnr == nil)
  164.         /* resolver not loaded error */
  165.         return(notOpenErr);
  166.         
  167.     /* call close resolver */
  168.     (void) (*dnr)((long) CLOSERESOLVER);    /* BYU LSC - needed (long) */
  169.  
  170.     /* release the DNR resource package */
  171.     HUnlock(codeHndl);
  172.     DisposHandle(codeHndl);
  173.     dnr = nil;
  174.     return(noErr);
  175.     }
  176.  
  177. OSErr StrToAddr(char *hostName, struct hostInfo *rtnStruct, long resultproc, char *userDataPtr)
  178. {
  179.     if (dnr == nil)
  180.         /* resolver not loaded error */
  181.         return(notOpenErr);
  182.         
  183.     return((*dnr)((long) STRTOADDR, hostName, rtnStruct, resultproc, userDataPtr));        /* BYU LSC - needed (long) */
  184.     }
  185.     
  186. OSErr AddrToStr(unsigned long addr, char *addrStr)
  187. {
  188.     if (dnr == nil)
  189.         /* resolver not loaded error */
  190.         return(notOpenErr);
  191.         
  192.     (*dnr)((long) ADDRTOSTR, addr, addrStr);    /* BYU LSC - needed (long) */
  193.     return(noErr);
  194.     }
  195.     
  196. OSErr EnumCache(long resultproc, char *userDataPtr)
  197. {
  198.     if (dnr == nil)
  199.         /* resolver not loaded error */
  200.         return(notOpenErr);
  201.         
  202.     return((*dnr)((long) ENUMCACHE, resultproc, userDataPtr));    /* BYU LSC - needed (long) */
  203.     }
  204.     
  205.     
  206. OSErr AddrToName(unsigned long addr, struct hostInfo *rtnStruct, long resultproc, char *userDataPtr)
  207. {
  208.     if (dnr == nil)
  209.         /* resolver not loaded error */
  210.         return(notOpenErr);
  211.         
  212.     return((*dnr)((long) ADDRTONAME, addr, rtnStruct, resultproc, userDataPtr));    /* BYU LSC - needed (long) */
  213.     }
  214.